//
//  QTIRWCP.h
//  KyBluetoothPlugin
//
//  Created by ky on 2024/6/25.
//

#import <Foundation/Foundation.h>

/*!
 @enum QTIRWCP状态
 @brief 当前的传输状态
 */
typedef NS_ENUM(NSInteger, QTIRWCPState) {
    /// 客户端和服务器。客户端等待发送第一个 SYN 以启动会话。服务器正在等待 SYN。
    QTIRWCPState_Listen,
    /// 仅限客户端。客户端已发送 SYN，正在等待服务器回复 SYN+ACK。
    QTIRWCPState_SynSent,
    /// 客户端和服务器。客户端向服务器发送数据段。服务器从客户端接收数据段。服务器向客户端发送 ACK+ 序列段。
    QTIRWCPState_Established,
    /// 仅限客户端。客户端已向服务器发送 RST 数据包。服务器正在等待来自服务器的 RST+ACK。
    QTIRWCPState_Closing
};

@protocol QTIRWCPDelegate;
@protocol GaiaDeviceConnectionProtocol;

@interface QTIRWCP : NSObject

/// @brief 用于回调的委托类。
@property (nonatomic, weak, nullable) id<QTIRWCPDelegate> delegate;

/// @brief 在 RWCP 忙碌时用于保存数据的缓冲区。一旦最近的数据段用完，数据将从数据缓冲区移出。
@property (nonatomic) NSMutableArray * _Nullable dataBuffer;

/// @brief 将该标志设置为 true 会告诉 RWCP，文件的最后一个字节已被写入数据缓冲区或最近的数据段。
@property (nonatomic) BOOL lastByteSent;

/// @brief 用于计算进度的文件大小。
@property (nonatomic) NSUInteger fileSize;

/// @brief 覆盖默认拥塞窗口大小
@property (nonatomic) NSInteger initialCongestionWindowSize;

/// @brief 覆盖最大拥塞窗口大小
@property (nonatomic) NSInteger maximumCongestionWindowSize;

/*!
 @brief 连接 Gaia 服务。为执行命令设置特征。
 @param connection 用于通信的连接
 */
- (instancetype _Nonnull)initWithConnection:(id<GaiaDeviceConnectionProtocol> _Nonnull)connection;

- (void)teardown;

- (void)didReceiveData:(NSData * _Nonnull)data;

/// @brief 蓝牙接口已关闭。
- (void)powerOff;

/*!
 @brief 向写入缓冲区添加数据
 @param data 文件数据
 */
- (void)setPayload:(NSData *_Nonnull)data;

/*!
 @brief payload 已设定，开始 RWCP 传输
 */
- (void)startTransfer;

/*!
 @brief 停止当前传输
 */
- (void)abort;

@end


/*!
 @protocol CSRUpdateManagerDelegate
 @discussion Callbacks from changes to state
 */
@protocol QTIRWCPDelegate <NSObject>

/*!
 @brief The upgrade aborted.
 @param error Look at the error so see what went wrong
 */
- (void)didAbortWithError:(NSError *_Nonnull)error;

@optional
/// @brief The final packet was sent. A packet with the more data set to GaiaCommandAction_Abort.
- (void)didCompleteDataSend;

/*!
 @brief The upgrade made some progress
 @param value Percentage complete
 */
- (void)didMakeProgress:(double)value;

/*!
 @brief State information about the device. Used when the device is in it's reboot cycle.
 @param value A string with some status information
 */
- (void)didUpdateStatus:(NSString *_Nonnull)value;

@end
